#include<iostream>
#include<cstring>
#include<ctime>
#include<unistd.h>
#include<signal.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>

using namespace std;

void handler(int signo)
{
    pid_t rid;
    while((rid=waitpid(-1,nullptr,WNOHANG))>0)//循环接收多个子进程的退出信息
    {
        cout<<"I am process "<<getpid()<<" catch a signo:"<<signo
        <<"child process quit:"<<rid<<endl;
    }
}
int main()
{
    //signal(17,SIG_IGN);//改变信号默认方式，子进程会自动清理，不通知父进程也不产生僵尸
    //signal(17,handler);//捕捉信号函数
    for(int i=0;i<10;i++)//循环创建多个子进程
    {
        pid_t id=fork();//之后父子进程各为独立执行流，执行后面逻辑
        if(id==0)
      {
        while(true)
        {
            cout<<"I am child process: "<<getpid()<<endl;
            sleep(5);
            break;
        }
        cout << "child quit???" << endl;
        exit(0);
      }
      sleep(1);//减少了对标准输出流的并发争抢，降低打印错乱的可能
    }
    //father
    while(true)
    {
        cout<<"I am father process: "<<getpid()<<endl;
        sleep(1);
    }
    return 0;
}

// volatile int flag=0;
// void handler(int signo)
// {
//     cout<<"catch a signal: "<<signo<<endl;
//     flag=1;
// }
// int main()
// {
//     signal(2,handler);
//     while(!flag);//flag为0时真
//     cout<<"process quit normal"<<endl;
//     return 0;
// }
// void PrintPending()
// {
//     sigset_t set;
//     sigpending(&set);//获取未决信号集
//     for(int signo =31;signo>0;signo--)
//     {
//         if(sigismember(&set,signo)) cout<<"1";
//         else cout<<"0";
//     }
//     cout<<endl;
// }

// void handler(int signo)
// {
//     //PrintPending();//证明在递达前就已经将pending表清零
//     cout<<"catch a signo: "<<signo<<endl;
//     while(true)
//     {
//         PrintPending();
//         sleep(1);
//     }
// }

// int main()
// {
//     struct sigaction act, oact;
//     memset(&act,0,sizeof(act));
//     memset(&oact,0,sizeof(oact));
//     sigemptyset(&act.sa_mask);
//     sigaddset(&act.sa_mask,1);//阻塞其他信号
//     sigaddset(&act.sa_mask,3);
//     sigaddset(&act.sa_mask,4);
//     act.sa_handler=handler;//设置参数捕捉2号信号
//     sigaction(2,&act,&oact);
//     while(true)
//     {
//         cout<<"I am a process: "<<getpid()<<endl;
//         sleep(1);
//     }
//     return 0;
// }